setwd("~/ALEJANDRO/1er Ciclo 2023/Mineria de Datos/Tarea 7/Datos Clase y Tareas")
Datos <- read.table("Tumores.csv", header=TRUE, sep=',',dec='.',stringsAsFactors = T)
enteros <- sapply(Datos, is.integer)
Datos[enteros] <- lapply(Datos[enteros], as.factor)
set.seed(123) # Fijamos la semilla para reproducibilidad
indice <- createDataPartition(y = Datos$tipo, p = 0.25, list = FALSE)
ttesting <- Datos[indice, ]
taprendizaje <- Datos[-indice, ]
tabla.comparacion <- data.frame()
#Linear
modelo <- train.svm(tipo~., data = taprendizaje, kernel = "linear")
prediccion <- predict(modelo, ttesting, type = "class")
MC <- confusion.matrix(ttesting, prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"svm-linear"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
#radial
modelo <- train.svm(tipo~., data = taprendizaje, kernel = "radial")
prediccion <- predict(modelo, ttesting, type = "class")
MC <- confusion.matrix(ttesting, prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"svm-radial"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
#Polynomial
modelo <- train.svm(tipo~., data = taprendizaje, kernel = "polynomial")
prediccion <- predict(modelo, ttesting, type = "class")
MC <- confusion.matrix(ttesting, prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"svm-polynomial"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
#Sigmoid
modelo <- train.svm(tipo~., data = taprendizaje, kernel = "sigmoid")
prediccion <- predict(modelo, ttesting, type = "class")
MC <- confusion.matrix(ttesting, prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"svm-sigmoid"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
tam <- floor(sqrt(nrow(Datos)))
modelo<- train.knn(tipo~., data = taprendizaje, kmax=tam)
prediccion <- predict(modelo, ttesting, type = "class")
MC <- confusion.matrix(ttesting, prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"svm polynomial"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
tabla.comparacion <- select(tabla.comparacion, Modelo, everything())
tabla.comparacion
## Modelo overall.accuracy overall.error category.accuracy.0
## 1 svm-linear 0.946875 0.053125 0.60
## 2 svm-radial 0.921875 0.078125 0.00
## 3 svm-polynomial 0.921875 0.078125 0.00
## 4 svm-sigmoid 0.921875 0.078125 0.00
## 5 svm polynomial 0.915625 0.084375 0.52
## category.accuracy.1
## 1 0.9762712
## 2 1.0000000
## 3 1.0000000
## 4 1.0000000
## 5 0.9491525
Como se puede observar, los metodos de SVM superan en precision al metodo knn, la mayoria o casi todos son mejores que knn. Mas especificamente, el metodo SVM con kernel “linear” es el mejor entre todos.
setwd("~/ALEJANDRO/1er Ciclo 2023/Mineria de Datos/Tarea 7/Datos Clase y Tareas")
Datos <- read.table("titanicV2020.csv", header=TRUE, sep=',',dec='.',stringsAsFactors = T)
# Eliminamos las columnas PassengerId,Name,SibSp,Parch,Ticket, Cabin, Embarked:
Datos <- subset(Datos, select = -c(PassengerId,Name,SibSp,Parch,Ticket, Cabin, Embarked))
#omitimos nulos
Datos<-na.omit(Datos)
#recodificamos
enteros <- sapply(Datos, is.integer)
Datos[enteros] <- lapply(Datos[enteros], as.factor)
#--------------------------------------
#2.2
muestra <- sample(nrow(Datos), floor(0.8 * nrow(Datos)))
taprendizaje <- Datos[muestra,]
ttesting <- Datos[-muestra,]
#--------------------------------------
#2.3
#tabla de comparacion de valores
tabla.comparacion <- data.frame()
#modelo con SVM
modelo.svm <- train.svm(Survived~., data = taprendizaje)
prediccion <- predict(modelo.svm, ttesting, type = "class")
MC <- confusion.matrix(ttesting, prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"svm"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
#--------------------------------------
#2.4
#modelo con train.knn
modelo<-train.knn(Survived~.,data=taprendizaje, kmax=floor(sqrt(nrow(Datos))))
prediccion <- predict(modelo, ttesting, type = "class")
MC <- confusion.matrix(ttesting, prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"knn"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
tabla.comparacion <- select(tabla.comparacion, Modelo, everything())
#Comparaciones
tabla.comparacion
## Modelo overall.accuracy overall.error category.accuracy.0 category.accuracy.1
## 1 svm 0.8708134 0.1291866 0.9186992 0.8023256
## 2 knn 0.8660287 0.1339713 0.9105691 0.8023256
Como podemos observar en la tabla de comparaciones, el metodo SVM es mejor que el metodo KNN, ya que la precision global es mas alta, el error global es mas bajo, y la precision por categoria tambien es mas alta que en el modelo con KNN.
setwd("~/ALEJANDRO/1er Ciclo 2023/Mineria de Datos/Tarea 7/Datos Clase y Tareas")
Datos <- read.table("ZipData_2020.csv", header=TRUE, sep=';',dec='.', stringsAsFactors = T)
set.seed(123)
tam<-dim(Datos)
n<-tam[1]
muestra <- sample(1:n,floor(n*0.20))
ttesting <- Datos[muestra,]
taprendizaje <- Datos[-muestra,]
modelo<-train.svm(Numero~.,data=(taprendizaje),kmax=floor(sqrt(n)))
prediccion <- predict(modelo, ttesting, type = "class")
MC<-confusion.matrix(ttesting, prediccion)
general.indexes(mc=MC)
##
## Confusion Matrix:
## prediction
## real cero cinco cuatro dos nueve ocho seis siete tres uno
## cero 287 0 0 0 0 0 2 0 1 0
## cinco 0 139 2 0 0 1 1 0 1 0
## cuatro 0 0 190 1 0 1 0 0 0 0
## dos 0 1 3 183 0 1 0 1 2 0
## nueve 0 0 4 0 157 0 0 2 0 0
## ocho 3 3 1 1 1 139 0 1 1 1
## seis 1 0 0 2 0 0 172 0 0 0
## siete 0 0 3 1 2 0 0 146 0 0
## tres 0 5 1 1 0 2 0 0 156 0
## uno 0 0 1 0 0 0 1 0 0 234
##
## Overall Accuracy: 0.9699
## Overall Error: 0.0301
##
## Category Accuracy:
##
## cero cinco cuatro dos nueve ocho seis siete tres uno
## 0.989655 0.965278 0.989583 0.958115 0.963190 0.920530 0.982857 0.960526 0.945455 0.991525
Los resultados son bastante buenos, ya que se obtiene una precision global por encima de los 90%, ademas de que por categoria tambien obtenemos mas del 90% de precision, hasta mas del 95% en la mayoria, por lo que lo convierte en un muy buen modelo.
#tabla de comparacion de valores
tabla.comparacion <- data.frame()
modelo <- train.svm(Numero~., data = taprendizaje,kmax=floor(sqrt(n)))
prediccion <- predict(modelo,ttesting)
MC<-confusion.matrix(ttesting,prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"SVM"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
# tabla.comparacion
modelo<-train.knn(Numero~.,data=(taprendizaje),kmax=floor(sqrt(n)))
prediccion <- predict(modelo, ttesting, type = "class")
MC<-confusion.matrix(ttesting, prediccion)
metricas<- c((general.indexes(mc=MC)[c(-1,-4)]),(unlist(general.indexes(mc=MC)[4])))
metricas$Modelo <-"KNN"
tabla.comparacion <- rbind(tabla.comparacion,metricas)
tabla.comparacion <- select(tabla.comparacion, Modelo, everything())
tabla.comparacion
## Modelo overall.accuracy overall.error category.accuracy.cero
## 1 SVM 0.9698763 0.03012372 0.9896552
## 2 KNN 0.9618074 0.03819258 0.9931034
## category.accuracy.cinco category.accuracy.cuatro category.accuracy.dos
## 1 0.9652778 0.9895833 0.9581152
## 2 0.9444444 0.9635417 0.9319372
## category.accuracy.nueve category.accuracy.ocho category.accuracy.seis
## 1 0.9631902 0.9205298 0.9828571
## 2 0.9815951 0.9072848 0.9714286
## category.accuracy.siete category.accuracy.tres category.accuracy.uno
## 1 0.9605263 0.9454545 0.9915254
## 2 0.9671053 0.9272727 0.9915254
Como podemos observar en la tabla de comparaciones, el metodo SVM es mejor que el metodo KNN, ya que la precision global es mas alta, el error global es mas bajo, y la precision por categoria tambien es mas alta que en el modelo con KNN.
datos <- data.frame ( x = c(1 , 1 , 1 , 3 , 1 , 3 , 1 , 3 , 1) ,
y = c(0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 1) ,
z = c(1 , 2 , 2 , 4 , 3 , 3 , 1 , 1 , 0) ,
clase = c(" Rojo ", " Rojo ", " Rojo ",
" Rojo ", " Rojo ", " Azul ",
" Azul ", " Azul ", " Azul "))
datos$clase <- trimws(datos$clase)
datos$clase <- factor(datos$clase)
datos$clase <- as.numeric(datos$clase)
dim(datos)
## [1] 9 4
datos$clase
## [1] 2 2 2 2 2 1 1 1 1
str(datos)
## 'data.frame': 9 obs. of 4 variables:
## $ x : num 1 1 1 3 1 3 1 3 1
## $ y : num 0 0 1 1 1 2 2 2 1
## $ z : num 1 2 2 4 3 3 1 1 0
## $ clase: num 2 2 2 2 2 1 1 1 1
plot_ly(data = datos) %>%
add_trace(x = ~x, y = ~y, z = ~z, color = ~clase,
colors = c("#0C4B8E", "#BF382A"),
mode = "markers", type="scatter3d")
modelo <- svm(clase ~ ., data = datos, kernel = "linear")
vectores_soporte <- modelo$SV
coeficientes <- modelo$coefs
intercepto <- modelo$rho
# obtener las variables predictoras (x, y, z) en una matriz
matriz_datos <- as.matrix(datos)
# calcular los límites de los ejes x, y y z para el gráfico
x_lim <- range(datos$x)
y_lim <- range(datos$y)
z_lim <- range(datos$z)
hiperplano <- function(x, y) {
(-coeficientes[1] * x - coeficientes[2] * y - intercepto) / coeficientes[3]
}
# crear la visualización del hiperplano de separación
plot_ly(x = vectores_soporte[, 1], y = vectores_soporte[, 2], z = vectores_soporte[, 3],
color = (modelo$y), colors = c("#0C4B8E", "#BF382A"),
mode = "markers", type="scatter3d") %>%
add_trace(x = matriz_datos[, 1], y = matriz_datos[, 2], z = matriz_datos[, 3],
color = (datos$clase), colors = c("#0C4B8E", "#BF382A"),
mode = "markers", type="scatter3d") %>%
add_trace(x = x_lim[1]:x_lim[2], y = y_lim[1]:y_lim[2],
z = hiperplano(x_lim[1]:x_lim[2], y_lim[1]:y_lim[2]),
type = "surface", opacity = 0.5) %>%
layout(scene = list(xaxis = list(range = x_lim),
yaxis = list(range = y_lim),
zaxis = list(range = z_lim)))
## Warning: 'surface' objects don't have these attributes: 'mode'
## Valid attributes include:
## '_deprecated', 'autocolorscale', 'cauto', 'cmax', 'cmid', 'cmin', 'coloraxis', 'colorbar', 'colorscale', 'connectgaps', 'contours', 'customdata', 'customdatasrc', 'hidesurface', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'lighting', 'lightposition', 'meta', 'metasrc', 'name', 'opacity', 'opacityscale', 'reversescale', 'scene', 'showlegend', 'showscale', 'stream', 'surfacecolor', 'surfacecolorsrc', 'text', 'textsrc', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'
La regla de clasificación sería la siguiente: un punto se clasifica como “Rojo” si -0.5x + 0.5y + 1.5z - 1 > 0, y se clasifica como “Azul” en caso contrario.
El margen para el hiperplano óptimo es de 1/|w| = 2/3. Los vectores de soporte son las observaciones 3 y 9.
Un ligero movimiento de la octava observación no afectaría el hiperplano de margen máximo porque no es un vector de soporte.
plot(datos$x, datos$y, col = ifelse(datos$clase == "Rojo", "red", "blue"), pch = 19)
legend("topright", legend = levels(factor(datos$clase)), col = c("red", "blue"), pch = 19)
abline(a = 0, b = -1, col = "green")